<?php
/**
 * Redis 操作类
 */
namespace common\services;

// 调用写法     RedisService::getInstance()->set('key','value',60);
class RedisService{

	const CHANNEL_DEFAULT = 1;
    
    private static $redis;
    private static $_instance;

    public static function getInstance($channel = '1') {

        if (isset(self::$_instance)) {
            return self::$_instance;
        }
        $class = __CLASS__;
        self::$_instance = new $class();

        switch ($channel) {
            case self::CHANNEL_DEFAULT:
                self::$redis = \Yii::$app->redis;
                break;
            default:
                break;
        }

        return self::$_instance;
    }

    /**
     * redis 分库操作
     * 0 : 默认库;
     * 1 : 作为访问验证签名的数据库;
     */
    public function select($num=0){
       self::$redis->select($num);
    }

	/**
     * 设置值
     * @param string $key KEY名称
     * @param string|array $value 获取得到的数据
     * @param int $timeOut 时间
     */
    public function set($key, $value, $timeOut = 0)
    {
        $value = json_encode($value, true);
        $retRes = self::$redis->set($key, $value);
        if ($timeOut > 0) {
            self::$redis->expire($key, $timeOut);
        }
        return $retRes;
    }

    /**
     * 通过KEY获取数据
     * @param string $key KEY名称
     */
    public function get($key)
    {
        return self::$redis->get($key);
    }

    /**
     * 删除一条数据
     * @param string $key KEY名称
     */
    public function delete($key)
    {
        return self::$redis->del($key);
    }

    /**
     * 清空数据
     */
    public function flushAll()
    {
        return self::$redis->flushAll();
    }

    /**
     * 数据入队列
     * @param string $key KEY名称
     * @param string|array $value 获取得到的数据
     * @param bool $right 是否从右边开始入
     */
    public function push($key, $value, $right = true)
    {
        $value = json_encode($value);

        return $right ? self::$redis->rPush($key, $value) : self::$redis->lPush($key, $value);
    }

    /**
     * 数据出队列
     * @param string $key KEY名称
     * @param bool $left 是否从左边开始出数据
     */
    public function pop($key, $left = true)
    {
        $val = $left ? self::$redis->lPop($key) : self::$redis->rPop($key);

        return json_decode($val);
    }

    /**
     * 数据自增
     * @param string $key KEY名称
     */
    public function increment($key)
    {
        return self::$redis->incr($key);
    }

    /**
     * 数据自减
     * @param string $key KEY名称
     */
    public function decrement($key)
    {
        return self::$redis->decr($key);
    }

    /**
     * key是否存在，存在返回ture
     * @param string $key KEY名称
     */
    public function exists($key)
    {
        return self::$redis->exists($key);
    }
}